Command Pattern একটি ডিজাইন প্যাটার্ন যা একটি কাজ বা অ্যাকশনকে একটি অবজেক্ট হিসেবে রূপান্তরিত করে, যা পরে বিভিন্ন অংশে কার্যকরী হতে পারে। MVVM প্যাটার্নে, Command প্যাটার্ন View এবং ViewModel এর মধ্যে পরিষ্কারভাবে বিভাজন করতে সাহায্য করে, যেখানে View ইউজার ইন্টারঅ্যাকশন (যেমন বাটনে ক্লিক) থেকে ViewModel এর ফাংশনালিটি কল করতে পারে। RelayCommand একটি কমন ক্লাস যা ICommand ইন্টারফেস ইমপ্লিমেন্ট করে এবং ViewModel এর মধ্যে কমান্ড ম্যানেজমেন্ট সহজ করে।
এখানে Command Pattern এবং RelayCommand এর ব্যবহার এবং ইমপ্লিমেন্টেশন নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
Command Pattern মূলত একটি কাজ বা অ্যাকশনকে একটি Command অবজেক্টের মধ্যে encapsulate (গোছানো) করে এবং এই কমান্ডটি পরে প্রয়োগ করা হয়। View (যেমন বাটন ক্লিক) এর ইভেন্টগুলি ViewModel এর মেথডে পাঠানোর জন্য Command প্যাটার্ন ব্যবহার করা হয়। এর মাধ্যমে View সরাসরি ViewModel এর মেথডে কল না করে, Command অবজেক্টের মাধ্যমে এই কলটি ট্রিগার করতে পারে।
Execute()
এবং CanExecute()
.RelayCommand একটি কমন ক্লাস যা ICommand ইন্টারফেস ইমপ্লিমেন্ট করে এবং ViewModel থেকে কমান্ড ম্যানেজমেন্টের কাজ সহজ করে দেয়। এটি সাধারণত ViewModel এর মধ্যে UI Command লজিক কোড করার জন্য ব্যবহৃত হয়। RelayCommand ইউজারের ইন্টারঅ্যাকশন (যেমন বাটন ক্লিক) থেকে মেথড কল করার জন্য একযোগভাবে কাজ করে, এবং CanExecute() মেথডের মাধ্যমে নির্ধারণ করা হয়, যে কোন পরিস্থিতিতে কমান্ডটি কার্যকর হবে।
RelayCommand ইমপ্লিমেন্টেশন সাধারণত ICommand ইন্টারফেসের মাধ্যমে করা হয়। নিচে একটি উদাহরণ দেয়া হল যেখানে RelayCommand তৈরি করা হয়েছে এবং সেটি ViewModel এর মধ্যে ব্যবহার করা হয়েছে।
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
// Constructor to initialize Execute and CanExecute methods
public RelayCommand(Action execute, Func<bool> canExecute = null)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
// ICommand implementation
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute();
}
public void Execute(object parameter)
{
_execute();
}
}
এখানে, RelayCommand
দুটি প্রধান মেথড সংজ্ঞায়িত করে:
true
রিটার্ন করে, তবে কমান্ডটি চালানো যায়; যদি false
রিটার্ন করে, তবে কমান্ডটি নিষ্ক্রিয় হয়ে যায়।এখন, আমরা RelayCommand ব্যবহার করে ViewModel তৈরি করব। ধরুন, আমাদের একটি Login বাটন আছে, এবং আমরা সেটি ক্লিক করলে একটি মেথড কল করতে চাই। এই কাজের জন্য আমরা RelayCommand ব্যবহার করব।
public class LoginViewModel : INotifyPropertyChanged
{
private string _username;
private string _password;
public string Username
{
get { return _username; }
set { _username = value; OnPropertyChanged(); }
}
public string Password
{
get { return _password; }
set { _password = value; OnPropertyChanged(); }
}
// RelayCommand for Login button
public ICommand LoginCommand { get; private set; }
public LoginViewModel()
{
// Initialize the RelayCommand with the Execute and CanExecute logic
LoginCommand = new RelayCommand(ExecuteLogin, CanExecuteLogin);
}
// Execute method for Login
private void ExecuteLogin()
{
// Logic for logging in the user
if (!string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password))
{
// Authentication logic
Console.WriteLine("Logging in...");
}
else
{
Console.WriteLine("Please provide username and password.");
}
}
// CanExecute method to check if the Login button should be enabled
private bool CanExecuteLogin()
{
return !string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password);
}
// INotifyPropertyChanged implementation for updating UI
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
RelayCommand
যা ExecuteLogin এবং CanExecuteLogin মেথডগুলির মাধ্যমে Login ফাংশনালিটি পরিচালনা করে।View (XAML) এ RelayCommand ব্যবহার করার জন্য, আমরা Command প্রপার্টি ব্যবহার করে Button এর সাথে ViewModel এর কমান্ড বাইন্ড করব।
<Button Content="Login" Command="{Binding LoginCommand}" />
এখানে, Button এর Command
প্রপার্টি LoginCommand এর সাথে বাইন্ড করা হয়েছে। যখন Login বাটনে ক্লিক করা হবে, তখন LoginCommand.Execute() কল হবে, যা ViewModel এ ExecuteLogin() মেথড রান করবে।
Command Pattern এবং RelayCommand MVVM প্যাটার্নে অত্যন্ত গুরুত্বপূর্ণ ভূমিকা পালন করে। RelayCommand সাধারণত ViewModel এ কমান্ড লজিক লেখার জন্য ব্যবহৃত হয় এবং ICommand ইন্টারফেস ইমপ্লিমেন্ট করে View এবং ViewModel এর মধ্যে পরিষ্কার বিভাজন তৈরি করে। এটি ইউজারের ইনপুটকে একটি অবজেক্টে রূপান্তর করে, যা পরে কার্যকরী হয়, ফলে অ্যাপ্লিকেশনটি আরো টেস্টেবল, রিইউজেবল এবং মেইনটেনেবল হয়।
common.read_more